package jp.yvn.game.shooting.element;

import jp.yvn.game.shooting.R;
import jp.yvn.game.shooting.logic.StageLogic;
import jp.yvn.game.shooting.util.Const;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;

/**
 * メインキャラクターのオブジェクト
 * 
 * @author Yvn_pq
 */
public class MainCharactorEntity {

	/** 画像のパス */
	private final int[] BMP_ID = { R.drawable.reimu1, R.drawable.reimu2 };

	/** アニメ変更タイミング */
	private final int ANIM_CHANGE_POINT = 20;

	/** 主人公画像倍率 */
	private final float BMP_SCALE = 2.5f;

	/** 主人公の移動スピード倍率 */
	private final float SPEED_FACTOR = 0.1f;

	/** 中心座標 */
	private float mCenterX = 0;

	private float mCenterY = 0;

	/** 主人公画像リスト(アニメ用) */
	private final BitmapDrawable[] mMainBitmapList = new BitmapDrawable[BMP_ID.length];

	/** 主人公画像リスト(アニメ用) */
	private BitmapDrawable coreBmp;

	private int mAnimNumber = 0;

	/** 主人公アニメ用カウント */
	private int mMainAnimCnt = 0;

	/** 画像幅、高さ */
	private int mBmpWidth = 0;

	private int mBmpHeight = 0;

	private int mBmpHalfWidth = 0;

	private int mBmpHalfHeight = 0;

	/** 画面幅、高さ */
	private int mViewWitdth = 0;

	private int mViewHeight = 0;

	/** 現在の移動スピード */
	private int mMoveSpeedX = 0;

	private int mMoveSpeedY = 0;

	/** Context */
	private final Context mContext;

	/** 移動フラグ */
	boolean isMoving = false;

	/** 主人公用弾幕クラス */
	private MainBullet mMainBullet;

	/**
	 * コンストラクタ
	 */
	public MainCharactorEntity(Context context, int width, int height) {
		mContext = context;

		// 初期化
		setInit(mContext, width, height);
	}

	/**
	 * 初期座標設定します
	 * 
	 * @param width
	 *            Viewの幅
	 * @param height
	 *            Viewの高さ
	 */
	private final void setInit(Context context, int width, int height) {
		Resources res = mContext.getResources();
		coreBmp = new BitmapDrawable(Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.bllet_small_white), Const.MAIN_CORE_POINT, Const.MAIN_CORE_POINT, true));
		// 主人公画像読込
		for (int i = 0; i < BMP_ID.length; i++) {
			mMainBitmapList[i] = new BitmapDrawable(Bitmap.createBitmap(BitmapFactory.decodeResource(res, BMP_ID[i])));
		}
		// 画像幅、高さ読込
		mBmpWidth = (int) (mMainBitmapList[0].getIntrinsicWidth() * BMP_SCALE);
		mBmpHeight = (int) (mMainBitmapList[0].getIntrinsicHeight() * BMP_SCALE);
		mBmpHalfWidth = mBmpWidth / 2;
		mBmpHalfHeight = mBmpHeight / 2;
		mViewWitdth = width;
		mViewHeight = height;
		mCenterX = (mViewWitdth / 2);
		mCenterY = mViewHeight - (mBmpHeight / 2);
		mMainBullet = new MainBullet();
		// 弾幕をセットします
		mMainBullet.fireBullet();

	}

	/**
	 * 移動状態をセットします
	 * 
	 * @param touchArea
	 */
	public void setMove(TouchAreaEntity touchArea) {
		isMoving = touchArea.mMovePressed;
		mMoveSpeedX = (int) (touchArea.mMoveX * SPEED_FACTOR);
		mMoveSpeedY = (int) (touchArea.mMoveY * SPEED_FACTOR);
	}

	public void action() {
		if (isMoving) {
			mCenterX += mMoveSpeedX;
			mCenterY += mMoveSpeedY;
		}
		if (mCenterX > mViewWitdth - mBmpHalfWidth) {
			mCenterX = mViewWitdth - mBmpHalfWidth;
		} else if (mCenterX < mBmpHalfWidth) {
			mCenterX = mBmpHalfWidth;
		}
		if (mCenterY > mViewHeight - mBmpHalfHeight) {
			mCenterY = mViewHeight - mBmpHalfHeight;
		} else if (mCenterY < mBmpHalfHeight) {
			mCenterY = mBmpHalfHeight;
		}
		// アニメーション更新
		setAnimation();
		// 主人公弾幕追加
		mMainBullet.fireBullet();
		// 弾幕接触判定
		mMainBullet.hitEnemy();
	}

	/**
	 * 描画します
	 * 
	 * @param canvas
	 */
	public void draw(Canvas canvas) {

		// 主人公の描画
		mMainBitmapList[mAnimNumber].setBounds((int) (mCenterX - mBmpHalfWidth), (int) (mCenterY - mBmpHalfHeight), (int) (mCenterX + mBmpHalfWidth), (int) (mCenterY + mBmpHalfHeight));
		mMainBitmapList[mAnimNumber].draw(canvas);

		// 接触ポイントの描画
		coreBmp.setBounds((int) (mCenterX - Const.MAIN_HALF_CORE_POINT), (int) (mCenterY - Const.MAIN_HALF_CORE_POINT), (int) (mCenterX + Const.MAIN_HALF_CORE_POINT),
				(int) (mCenterY + Const.MAIN_HALF_CORE_POINT));
		// coreBmp.setAlpha(200);
		coreBmp.draw(canvas);

		// 弾幕の描画
		mMainBullet.draw(canvas);

	}

	/**
	 * アニメーションを設定します
	 */
	private void setAnimation() {
		// 特定のフレーム数で画像を変更
		if (mMainAnimCnt < ANIM_CHANGE_POINT) {
			mMainAnimCnt++;
		} else {
			// ここは主人公の表現画像は2枚のみの場合は下記メッソドを使えます
			mAnimNumber ^= 1;
			mMainAnimCnt = 0;
		}
	}

	/**
	 * 主人公用弾幕クラス
	 * 
	 * @author Yvn_pq
	 */
	private class MainBullet {

		/** 弾幕発射タイミング */
		private final int BULLET_FIRE_POINT = 4;

		/** 弾幕画像 */
		private final Bitmap mBulletImg;

		private final int max_bullet = mViewHeight / Const.MAIN_BULLET_HEIGHT;

		private final MainBulletEntity mBulletArray[] = new MainBulletEntity[max_bullet];

		/** 弾幕発射用カウント */
		private int mBulletFireCnt = 0;

		private final int fireOffset = mBmpHalfHeight + Const.MAIN_BULLET_HALF_HEIGHT;

		private final int damage = 1;

		private final Paint p = new Paint();

		/**
		 * コンストラクタ
		 * 
		 * @param context
		 */
		public MainBullet() {
			// 画像読み込み
			Resources res = mContext.getResources();
			mBulletImg = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, R.drawable.amulet_red_001), Const.MAIN_BULLET_WIDTH, Const.MAIN_BULLET_HEIGHT, true);
			for (int i = 0; i < max_bullet; i++) {
				mBulletArray[i] = new MainBulletEntity(0, 0);
			}
		}

		public void draw(Canvas c) {
			for (int i = 0; i < max_bullet; i++) {
				if (mBulletArray[i].active) {
					mBulletArray[i].draw(c, mBulletImg, p);
				}
			}
		}

		public void hitEnemy() {
			for (MainBulletEntity mbe : mBulletArray) {
				for (BaseEnemyEntity bee : StageLogic.enemyList) {
					if (mbe.active && mbe.centerX > bee.mCenterPoint.x - bee.halfWidth - Const.MAIN_BULLET_HALF_WIDTH
							&& mbe.centerX < bee.mCenterPoint.x + bee.halfWidth + Const.MAIN_BULLET_HALF_WIDTH
							&& mbe.centerY > bee.mCenterPoint.y - bee.halfHeight - Const.MAIN_BULLET_HALF_HEIGHT
							&& mbe.centerY < bee.mCenterPoint.y + bee.halfHeight + Const.MAIN_BULLET_HALF_HEIGHT) {
						bee.takeDamage(damage);
						mbe.active = false;
					}
				}
			}
		}

		/**
		 * 弾幕を追加します
		 */
		public void fireBullet() {
			if (mBulletFireCnt < BULLET_FIRE_POINT) {
				mBulletFireCnt++;
			} else {
				for (int i = 0; i < max_bullet; i++) {
					if (!mBulletArray[i].active) {
						mBulletArray[i].centerX = mCenterX;
						mBulletArray[i].centerY = mCenterY - fireOffset;
						mBulletArray[i].active = true;
						mBulletFireCnt = 0;
						break;
					}
				}
			}
			for (int i = 0; i < max_bullet; i++) {
				if (mBulletArray[i].active) {
					mBulletArray[i].updateMove();
				}
			}
		}
	}
}
